package com.atguigu.Base;

import org.springframework.boot.test.context.SpringBootTest;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

@SpringBootTest
public class ReentrantLockDemo {

    //这里写的是可重复锁又称为递归锁
    //意思就是在同一个线程中，外层方法获取锁的时候，内层方法可以获取锁。
    //优点：避免死锁

    public synchronized void A(){

        System.out.println("A");
        this.B();
    }
    //这个方法中this.B()调用方法是递归调用
    //在上面就先输出B。在下面就先输出A

    public synchronized void B(){
        System.out.println("B");
    }

    private final ReentrantLock lock = new ReentrantLock();
    //创建一个只能在本类中访问且不可变的锁
    //ReentrantLock是Java并发包（concurrent）中的一个可重入锁的实现类
    //并发就是多个任务交替进行

    public void C(){
        lock.lock();
        try {
            //D();
            System.out.println("C");
           D();

        } finally {
            lock.unlock();
        }
    }

    private void D()  {
        lock.lock();
        try {
            System.out.println("D");
        }finally {
            lock.unlock();
        }
    }


    public static void main(String[] args) {
        ReentrantLockDemo demo = new ReentrantLockDemo();
        //demo.A();
        demo.C();
    }

}
